#ifndef LOGGER_H
#define LOGGER_H
#include <string>
#include <iostream>
#include <chrono>
#include <iomanip>
#include <sstream>
#include <mutex>

/**
 * @brief 日志级别枚举
 * 定义不同的日志详细程度
 */
enum class LogLevel {
    DEBUG,    // 调试信息，最详细
    INFO,     // 一般信息，正常运行日志
    WARNING,  // 警告信息，可能的问题
    ERROR     // 错误信息，需要关注的问题
};

/**
 * @brief 日志记录器类
 * 提供线程安全的日志记录功能
 */
class Logger {
public:
    /**
     * @brief 设置全局日志级别
     * @param level 要设置的日志级别
     * 低于此级别的日志消息将被过滤
     */
    static void set_level(LogLevel level);
    
    /**
     * @brief 获取当前日志级别
     */
    static LogLevel get_level();
    
    /**
     * @brief 记录调试信息
     * @param message 日志消息
     */
    static void debug(const std::string& message);
    
    /**
     * @brief 记录一般信息
     * @param message 日志消息
     */
    static void info(const std::string& message);
    
    /**
     * @brief 记录警告信息
     * @param message 日志消息
     */
    static void warning(const std::string& message);
    
    /**
     * @brief 记录错误信息
     * @param message 日志消息
     */
    static void error(const std::string& message);
    
    /**
     * @brief 格式化日志消息（高级用法）
     * @param level 日志级别
     * @param format 格式化字符串（类似printf）
     * @param ... 可变参数
     */
    static void log(LogLevel level, const char* format, ...);

private:
    /**
     * @brief 实际执行日志记录的核心方法
     * @param level 日志级别
     * @param message 日志消息
     */
    static void log_message(LogLevel level, const std::string& message);
    
    /**
     * @brief 获取当前时间字符串
     * @return 格式化的时间字符串
     */
    static std::string get_current_time();
    
    /**
     * @brief 将日志级别转换为字符串
     * @param level 日志级别
     * @return 级别字符串表示
     */
    static std::string level_to_string(LogLevel level);
    
    static LogLevel current_level_;  // 当前日志级别
    static std::mutex log_mutex_;    // 日志互斥锁（线程安全）
};

// 方便使用的宏定义
#define LOG_DEBUG(message) Logger::debug(message)
#define LOG_INFO(message) Logger::info(message)  
#define LOG_WARNING(message) Logger::warning(message)
#define LOG_ERROR(message) Logger::error(message)

// 带格式化的宏定义
#define LOG_DEBUG_F(format, ...) Logger::log(LogLevel::DEBUG, format, ##__VA_ARGS__)
#define LOG_INFO_F(format, ...) Logger::log(LogLevel::INFO, format, ##__VA_ARGS__)
#define LOG_WARNING_F(format, ...) Logger::log(LogLevel::WARNING, format, ##__VA_ARGS__)
#define LOG_ERROR_F(format, ...) Logger::log(LogLevel::ERROR, format, ##__VA_ARGS__)

#endif // LOGGER_H